#ifndef FACTMANAGER_H
#define FACTMANAGER_H

#include <QObject>
#include <QStringList>
#include <QSet>
#include <QFile>

// 前向声明
class DatabaseManager;

/**
 * @brief 事实管理器类，用于管理和存储事实
 * 
 * 该类负责事实的添加、删除、查询和持久化等功能，
 * 是专家系统中的核心组件之一
 */
class FactManager : public QObject
{
    Q_OBJECT
public:
    /**
     * @brief 构造函数
     * @param parent 父对象，默认为nullptr
     */
    explicit FactManager(QObject *parent = nullptr);

    // 事实管理功能
    
    /**
     * @brief 添加事实
     * @param fact 要添加的事实
     * @return 如果事实不存在且添加成功则返回true，否则返回false
     */
    bool addFact(const QString &fact);
    
    /**
     * @brief 移除事实
     * @param fact 要移除的事实
     * @return 如果事实存在且移除成功则返回true，否则返回false
     */
    bool removeFact(const QString &fact);
    
    /**
     * @brief 清空所有事实
     */
    void clearFacts();
    
    /**
     * @brief 检查事实是否存在
     * @param fact 要检查的事实
     * @return 如果事实存在则返回true，否则返回false
     */
    bool hasFact(const QString &fact) const;
    
    /**
     * @brief 获取所有事实
     * @return 包含所有事实的字符串列表
     */
    QStringList getAllFacts() const;
    
    /**
     * @brief 获取事实数量
     * @return 事实的数量
     */
    int getFactCount() const;

    // 批量操作
    
    /**
     * @brief 批量添加事实
     * @param facts 要添加的事实列表
     */
    void addFacts(const QStringList &facts);

    // 持久化功能
    
    /**
     * @brief 将事实保存到文件
     * @param filename 文件名
     * @return 如果保存成功则返回true，否则返回false
     */
    bool saveFactsToFile(const QString &filename) const;
    
    /**
     * @brief 从文件加载事实
     * @param filename 文件名
     * @return 如果加载成功则返回true，否则返回false
     */
    bool loadFactsFromFile(const QString &filename);
    
    // 数据库功能
    
    /**
     * @brief 设置数据库管理器
     * @param dbManager 数据库管理器指针
     */
    void setDatabaseManager(DatabaseManager *dbManager);
    
    /**
     * @brief 从数据库加载特征
     * @return 如果加载成功则返回true，否则返回false
     */
    bool loadFeaturesFromDatabase();
    
    /**
     * @brief 获取所有可用特征
     * @return 包含所有可用特征的字符串列表
     */
    QStringList getAvailableFeatures() const;

signals:
    /**
     * @brief 事实添加信号
     * @param fact 被添加的事实
     */
    void factAdded(const QString &fact);
    
    /**
     * @brief 事实移除信号
     * @param fact 被移除的事实
     */
    void factRemoved(const QString &fact);
    
    /**
     * @brief 事实变化信号
     */
    void factsChanged();
    
    /**
     * @brief 特征列表变化信号
     */
    void featuresChanged();

private:
    QSet<QString> m_facts;             ///< 使用QSet来去重的事实集合
    QStringList m_factOrder;            ///< 保留添加顺序的事实列表
    DatabaseManager *m_dbManager;      ///< 数据库管理器指针
    QStringList m_availableFeatures;    ///< 可用特征列表
};

#endif // FACTMANAGER_H